#include<iostream>
#include<cstdio>
#include<string.h>
#include<set>
#include<string>
#include<cmath>
using namespace std;

#define maxn 1010*100

#define see(x) cout<<#x<<":"<<x<<endl;

/**********后缀数组无RMQ模板************************/
//sa[i]排第i的元素是第几下标,sa下标1->n，值0->n-1,sa[0]=0因为a的最后一位是0
//rank[i]第i下标排第几,rank下标0->n-1,值 1->n
//h数组按照rank来确定 h[i]代表 i与i-1 的最大相同元素
//h下标 1->n h[1]=0;
int a[maxn],sa[maxn],container[maxn],wy[maxn],wv[maxn],wx[maxn],rank[maxn],h[maxn];

int cmp(int *r,int a,int b,int l)
{
    return (r[a]==r[b])&&(r[a+l]==r[b+l]);
}
void suffix(int *r,int n,int *sa,int m)
{
    int i,j,*t,*x=wx, *y=wy,p;
    memset(container,0,sizeof(int)*m);
    for(i=0; i<n; i++)  container[x[i]=r[i]]++;
    for(i=1; i<m; i++)  container[i]+=container[i-1];
    for(i=n-1; i>=0; i--)   sa[--container[x[i]]]=i;
    for(p=0,j=1; p<n; j<<=1,m=p)
    {
        for(p=0,i=n-j; i<n; i++)    y[p++]=i;
        for(i=0; i<n; i++)  if(sa[i]>=j)    y[p++]=sa[i]-j;
        for(i=0; i<n; i++)  wv[i]=x[y[i]];
        memset(container,0,sizeof(int)*m);
        for(i=0; i<n; i++)  container[wv[i]]++;
        for(i=1; i<m; i++)  container[i]+=container[i-1];
        for(i=n-1; i>=0; i--)  sa[--container[wv[i]]]=y[i];
        for(t=x,x=y,y=t,x[sa[0]]=0,p=1, i=1; i<n; i++)
            x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
    }


}
void cal(int *r,int *sa,int n)
{
    int i,j,k=0;
    for(i=1; i<=n; i++)  rank[sa[i]]=i;
    for(i=0; i<n; h[rank[i++]]=k)
        for(k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);

}
void debug()//用于快速复习和调试
{
	int i,n;
	char s[maxn];
	scanf("%s",s);
	for(i=0; i<strlen(s); i++)
	{
		a[i]=s[i];
	}
	n=strlen(s);
	a[i]=0;
    suffix(a,n+1,sa,350);
	cal(a,sa,n);
    for(i=0; i<=n; i++)
   		printf("%c\t",s[i]);  puts("");
    for(i=0; i<=n; i++)
    	printf("%d\t",sa[i]);  puts("");
    for(i=0; i<=n; i++)
    	printf("%s\n",&s[sa[i]]);
    for(i=0; i<=n; i++)
    	printf("%d\t",h[i]);  puts("");
}


/**********后缀数组无RMQ模板************************/
char s[1100];
int to[maxn];
int half,len;
int flag[1110];
int ok(int x,int y,int len)
{
	int i,j,k;
	int num=0;
	int ok=0;
	memset(flag,0,sizeof(flag));
	for(i=2; i<len;)
	{
		if(h[i]>=x)
		{
			j=0;
			while(h[i]>=x && i<len)
			{
				if( flag[to[sa[i]]]==0)
				{
					flag[to[sa[i]]]=1;
					j++;
				}
				if( flag[to[sa[i-1]]]==0)
				{
					flag[to[sa[i-1]]]=1;
					j++;
				}
				i++;
			}
			if(j>=half)
			{
				ok=1;	
				if(y)
				{
					for(k=sa[i-1];k<sa[i-1]+x;k++)
					{
						printf("%c",a[k]);
					}	
					puts("");
				}
				memset(flag,0,sizeof(flag));
			}
		}
		else
		{
			i++;
			memset(flag,0,sizeof(flag));
		}
	}
	return ok;
}

int cnt;
int get()
{
	if(cnt>='a' && cnt<='z')
		cnt='z'+1;
		
	return ++cnt;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
    int n,m,j,i,k,cas=0;
    while(scanf("%d",&n),n)
	{
		if(cas++)	puts("");	
		j=0;
		int maxx=0;
		cnt='z';
		for(i=0; i<n; i++)
		{
			scanf("%s",s);
			int le=strlen(s);
			for(k=0;k<le;k++)
			{
				a[j]=s[k];
				to[j]=i+1;
				j++;
			}
			a[j]=get();
			j++;
			maxx=max(maxx,le);
		}
		int all=cnt+2;
		len=j;
		a[len]=0;
		if(n==1)
		{
			printf("%s\n",s);
		}
		else
		{
	/**********后缀数组无RMQ模板************************/
			suffix(a,len+1,sa,all);
			//第二个传入长度加1，第四个传入a的最大值,不要太大
			cal(a,sa,len);
	/**********后缀数组无RMQ模板************************/
			half=n/2+1;
			int l=0,r=maxx;
			int ans=0;
			while(l<=r)
			{
				int mid=(l+r)/2;
				if(ok(mid,0,len))
				{
					ans=mid;
					l=mid+1;
				}
				else	r=mid-1;
			}
			if(ans==0)
			{
				printf("?\n");
			}
			else
			{
				ok(ans,1,len);
			}
		}
	}
}
